home *** CD-ROM | disk | FTP | other *** search
/ Amiga Inside! / Amiga FD Inside (1995)(Ultramax).iso / forumamiga / ausgabe09 / texte / scr_u._wins < prev    next >
Text File  |  1992-09-05  |  5KB  |  167 lines

  1.                                                              André Voget
  2.  
  3. Wer sich - wie ich - daran gewöhnt hat, statt den Gfa-Basic-Befehlen die
  4. Systemroutinen  zu nutzen, um kürzeren und schnelleren Code zu erzeugen,
  5. muß über kurz oder lang auch Screens und Windows selbst mit den  System­
  6. routinen öffnen. Meine Routinen möchte ich nun hier veröffentlichen. Für
  7. Anregungen und Verbesserungsvorschläge wäre ich sehr dankbar.
  8.  
  9. Vorteile  der  hier vorgestellten Routinen zu den entsprechenden Gfa-Ba­
  10. sic-Befehlen:
  11.  
  12. > kürzerer Code
  13. > volle Kontrolle
  14. > es  sind  keine  Grenzen   gesetzt,  die  die  maximale  Anzahl    von
  15.   Screens und Windows einschränkt
  16. > es  lassen  sich,  wenn  gewünscht,  auch  direkt   Gadgets  und   der
  17.   Systemfont  eintragen  (  das  gab  bei  mir  auch den Ausschlag, eine
  18.   eigene Screen-Routine zu schreiben )
  19.  
  20. Die Übergabeparameter sind in den entsprechenden  Routinen  erklärt.  Um
  21. diese  Routinen  nutzen  zu  können,  muß  man  vorher zwei Arrays ( für
  22. Screens und Windows ) definieren:
  23.  
  24. DIM scr%(anzahl_screens&), win%(anzahl_windows&)
  25.  
  26. Diese Variablen halten dann immer die Basisadressen der Screens und Win­
  27. dows. Wird ein Screen/Window geschlossen, dann wird die Variable automa­
  28. tisch gelöscht ( siehe Prozeduren ).
  29.  
  30. Die  Prozeduren sind übrigens Public Domain im eigentlichen Sinne, d.h.,
  31. Du darfst sie ohne Bedenken für  Deine  eigene  Programme  benutzen,  Du
  32. darfst  sie  verkaufen (:^) und Du darfst sie unter Deinem eigenen Namen
  33. veröffentlichen  (  das  dürfte allerdings dank dem Bekanntheitsgrad von
  34. Forum Amiga auffallen :-)
  35.  
  36. PROCEDURE oscreen(nr&,xpos&,ypos&,width&,height&,planes&,mode%,typ&)
  37.   '
  38.   ' Benötigt: Array "scr%(anzahl_screens&)"
  39.   '
  40.   ' Parameter:  nr& = Screennummer für Array
  41.   '             width& = Screenbreite
  42.   '             height& = Screenhöhe
  43.   '             planes& = Anzahl Bitplanes
  44.   '             mode% = 0:LowRes, $8000:MedRes, +4: Interlace
  45.   '             typ& = 1: WorkbenchScreen, 15: CustomScreen
  46.   '
  47.   LOCAL nscr%
  48.   nscr%=AllocMem(32,&H1+&H10000)
  49.   IF nscr%
  50.     DPOKE nscr%+0,xpos&
  51.     DPOKE nscr%+2,ypos&
  52.     DPOKE nscr%+4,width&
  53.     DPOKE nscr%+6,height&
  54.     DPOKE nscr%+8,planes&
  55.     POKE nscr%+10,2
  56.     POKE nscr%+11,1
  57.     DPOKE nscr%+12,mode%
  58.     DPOKE nscr%+14,typ&
  59.     REM LPOKE nscr%+16,V:textattr$  ! Erklärung siehe unten
  60.     scr%(nr&)=OpenScreen(nscr%)
  61.     ~FreeMem(nscr%,32)
  62.   ENDIF
  63. RETURN
  64.  
  65. PROCEDURE owindow(nr&,xpos&,ypos&,width&,height&,idcmp%,flags%,scrnr&)
  66.   '
  67.   ' Benötigt Array "win%(anzahl_windows&)"
  68.   '
  69.   ' nr& = Array-Nummer
  70.   ' xpos&,ypos&,width&,height& = Window-Maße
  71.   ' idcmp% = IDCMP-Flags ( siehe GFA-Interpreter-Handbuch )
  72.   ' flags% = Window-Flags (siehe GFA-Interpreter-Handbuch )
  73.   ' scrnr& = Arraynummer des Screens oder "-1" für aktuellen Screen
  74.   '
  75.   LOCAL nwin%
  76.   nwin%=AllocMem(48,&H1+&H10000)
  77.   IF nwin%
  78.     DPOKE nwin%+0,xpos&
  79.     DPOKE nwin%+2,ypos&
  80.     DPOKE nwin%+4,width&
  81.     DPOKE nwin%+6,height&
  82.     POKE nwin%+8,2
  83.     POKE nwin%+9,1
  84.     LPOKE nwin%+10,idcmp%
  85.     LPOKE nwin%+14,flags%
  86.     IF scrnr&=-1
  87.       LPOKE nwin%+30,0
  88.       DPOKE nwin%+46,1
  89.     ELSE
  90.       LPOKE nwin%+30,scr%(scrnr&)
  91.       DPOKE nwin%+46,15
  92.     ENDIF
  93.     win%(nr&)=OpenWindow(nwin%)
  94.     ~FreeMem(nwin%,48)
  95.   ENDIF
  96. RETURN
  97.  
  98. PROCEDURE cscreen(nr&)
  99.   '
  100.   ' schließt einen Screen ( nr& = Arraynummer )
  101.   '
  102.   IF scr%(nr&)
  103.     ~CloseScreen(scr%(nr&))
  104.     scr%(nr&)=0
  105.   ENDIF
  106. RETURN
  107.  
  108. PROCEDURE cwindow(nr&)
  109.   '
  110.   ' schließt ein Window ( nr& = Arraynummer )
  111.   '
  112.   IF win%(nr&)
  113.     ~CloseWindow(win%(nr&))
  114.     win%(nr&)=0
  115.   ENDIF
  116. RETURN
  117.  
  118. Um den Rastport des Windows zu bekommen, schreibt man:
  119.  
  120. rp%=LONG{win%(nr&)+50}
  121.  
  122. Um den Viewport des Screens zu bekommen, schreibt man:
  123.  
  124. vp%=scr%(1)+44
  125.  
  126. Diese  beiden  Zeiger  benötigt  man  nur  für Grafikoperationen mit den
  127. Systemroutinen. Bitte beachte, daß die Gfa-Basic-Befehle natürlich nicht
  128. auf diese Screens und Windows ansprechen,  ein  entsprechender  "PRINT"-
  129. Befehl öffnet ein eigenes Window!
  130.  
  131. Außerdem ist zu beachten, daß die Windows und Screens  auch  geschlossen
  132. werden  am  Programmende,  denn  das  übernimmt Gfa-Basic nun nicht mehr
  133. ( volle Kontrolle  heißt  auch  mehr  Arbeit  ;-).  Ein  ordnungsmäßiges
  134. Schließen sieht so aus:
  135.  
  136. @cwindow(arraynummer&)
  137. @screen(arraynummer&)
  138.  
  139. Ob die Screens/Windows auch tatsächlich existieren, prüfen diese  Routi-
  140. nen  automatisch  nach.  Um den Systemzeichensatz für eigene Screens und
  141. Windows zu benutzen, sollte man unmittelbar nach der  o.a.  "DIM"-Anwei­
  142. sung folgende Zeichen in ein Programm einführen:
  143.  
  144. font$="topaz.font"+CHR$(0)
  145. textattr$=MKL$(V:font$)+MKI$(8)+MKI$(0)
  146. font%=OpenFont(V:textattr$)
  147.  
  148. Wenn  diese  Zeilen  eingefügt werden, dann sollte auch der "REM"-Befehl
  149. in der "oscreen"-Prozedur gelöscht werden. Um den Font in  einem  Window
  150. zu benutzen, muß folgendermaßen vorgegangen werden:
  151.  
  152. @owindow(1,0,0,640,256,0,4096+65536,1)
  153. rp1%=LONG{win%(1)+50}
  154. ~SetFont(rp1%,font%)
  155.  
  156. Natürlich  sollte  nicht  vergessen werden, daß der Font am Programmende
  157. auch geschlossen werden muß, und zwar NACHDEM alle Windows  und  Screens
  158. geschlossen werden:
  159.  
  160. IF font%
  161.   ~CloseFont(font%)
  162. ENDIF
  163.  
  164. Fragen  bitte  über das Forum an mich, denn alle Leser sollen von mögli­
  165. chen Fragen profitieren... und nun viel Spaß!
  166.  
  167.